home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 3 / Gold Medal Software - Volume 3 (Gold Medal) (1994).iso / graphics / 3dvect30.arj / MACROS.INC < prev    next >
Text File  |  1993-11-18  |  8KB  |  296 lines

  1. ; macros used throughout
  2.  
  3. pushw      macro ww  ; push word, used for pushing constants
  4.            mov ax,ww
  5.            push ax
  6.            endm
  7.  
  8. drawline   macro xx1,yy1,xx2,yy2,col
  9.            pushw xx1
  10.            pushw yy1
  11.            pushw xx2
  12.            pushw yy2
  13.            pushw col
  14.            call draw_line
  15.            endm
  16.  
  17. block      macro xx1,yy1,xx2,yy2,col
  18.            pushw xx1
  19.            pushw yy1
  20.            pushw xx2
  21.            pushw yy2
  22.            pushw col
  23.            call fill_block
  24.            endm
  25.  
  26. char       macro chr,xx,yy,fc ; plot character
  27.  
  28.            push ax bx cx dx
  29.            mov ax,chr
  30.            push ax
  31.            mov ax,xx
  32.            push ax
  33.            mov ax,yy
  34.            push ax
  35.            mov ax,0
  36.            push ax
  37.            call tgprintc
  38.  
  39.            pop dx cx bx ax
  40.            mov ax,chr
  41.            push ax
  42.            mov ax,xx
  43.            add ax,1
  44.            push ax
  45.            mov ax,yy
  46.            sub ax,1
  47.            push ax
  48.            mov ax,fc
  49.            push ax
  50.            call tgprintc
  51.            endm
  52.  
  53. ; macro to out a 16 bit value to an i/o port
  54.  
  55. out_16     macro register, value
  56.            ifdifi <register>, <dx> ; if dx not setup
  57.            mov dx, register        ; then select register
  58.            endif
  59.            ifdifi <value>, <ax>    ; if ax not setup
  60.            mov ax, value           ; then get data value
  61.            endif
  62.            out dx, ax              ; set i/o register(s)
  63. endm
  64.  
  65. ; macro to out a 8 bit value to an i/o port
  66.  
  67. out_8      macro register, value
  68.            ifdifi <register>, <dx> ; if dx not setup
  69.            mov dx, register        ; then select register
  70.            endif
  71.            ifdifi <value>, <al>    ; if al not setup
  72.            mov al, value           ; then get data value
  73.            endif
  74.            out dx, al              ; set i/o register
  75. endm
  76.  
  77. ; macros to push and pop multiple registers
  78.  
  79. pushx      macro r1, r2, r3, r4, r5, r6, r7, r8
  80.            ifnb <r1>
  81.            push r1                 ; save r1
  82.            pushx r2, r3, r4, r5, r6, r7, r8
  83.            endif
  84. endm
  85.  
  86. popx       macro r1, r2, r3, r4, r5, r6, r7, r8
  87.            ifnb <r1>
  88.            pop r1                  ; restore r1
  89.            popx r2, r3, r4, r5, r6, r7, r8
  90.            endif
  91. endm
  92.  
  93. ; macro to clear registers to 0
  94.  
  95. clr        macro register, r2, r3, r4, r5, r6
  96.            ifnb <register>
  97.            xor register, register  ; set register = 0
  98.            clr r2, r3, r4, r5, r6
  99.            endif
  100. endm
  101.  
  102. ; macros to decrement counter & jump on condition
  103.  
  104. loopx      macro register, destination
  105.            dec register            ; counter--
  106.            jnz destination         ; jump if not 0
  107. endm
  108.  
  109. loopjz     macro register, destination
  110.            dec register            ; counter--
  111.            jz destination          ; jump if 0
  112. endm
  113.  
  114. ; macro to multiply by a constant - this can be done because of protected
  115. ; mode's lea function.
  116. ;
  117. ; use: cmul eax,ecx,12   eax=ecx*12
  118. ; as opposed to using imul
  119.  
  120. cmul       macro result,value,constant  ; constant multiply, use fast lea
  121.  
  122.            if constant eq 7
  123.            lea result,[value*4+value]   ; 7 = %0111
  124.            shl value,1
  125.            add result,value
  126.            cdq
  127.  
  128.            elseif constant eq 8
  129.            lea result,[value*8]         ; 8 = %1000
  130.            cdq
  131.  
  132.            elseif constant eq 9
  133.            lea result,[value*8+value]   ; 9 = %1001
  134.            cdq
  135.  
  136.            elseif constant eq 10
  137.            shl value,1
  138.            lea result,[value*4+value]   ; 10 = %1010
  139.            cdq
  140.  
  141.            elseif constant eq 11
  142.            lea result,[value*2+value]   ; 11 = %1011
  143.            shl value,3
  144.            add result,value
  145.            cdq
  146.  
  147.            elseif constant eq 12
  148.            lea result,[value*2+value]   ; 12 = %1100
  149.            shl result,2
  150.            cdq
  151.  
  152.            elseif constant eq 13
  153.            lea result,[value*2+value]   ; 13 = %1101
  154.            shl result,2
  155.            add result,value
  156.            cdq
  157.  
  158.            elseif constant eq 14
  159.            shl value,1
  160.            lea result,[value*4+value]   ; 14 = %1110
  161.            shl value,1
  162.            add result,value
  163.            cdq
  164.  
  165.            elseif constant eq 15
  166.            lea result,[value*4+value]   ; 15 = %1111
  167.            shl value,1
  168.            lea value,[value*4+value]
  169.            add result,value
  170.            cdq
  171.  
  172.            elseif constant eq 240
  173.            shl value,4
  174.            lea result,[value*4+value]   ; 240 = %0 1111 0000
  175.            shl value,1
  176.            lea value,[value*4+value]
  177.            add result,value
  178.            cdq
  179.  
  180.            elseif constant eq 260
  181.            lea result,[value*4]         ; 260 = %1 0000 0100
  182.            shl value,8
  183.            add result,value
  184.            cdq
  185.  
  186.            elseif constant eq 280
  187.            shl value,3
  188.            lea result,[value*2+value]   ; 240 = %1 0001 1000
  189.            shl value,5
  190.            add result,value
  191.            cdq
  192.  
  193.            elseif constant eq 300
  194.            shl value,2
  195.            lea result,[value*2+value]   ; 300 = %1 0010 1100
  196.            shl value,3
  197.            lea value,[value*8+value]
  198.            add result,value
  199.            cdq
  200.  
  201.            elseif constant eq 320
  202.            lea result,[value*4+value]   ; 320 = %1 0100 0000
  203.            shl result,6
  204.            cdq
  205.  
  206.            elseif constant eq 360
  207.            shl value,3
  208.            lea result,[value*4+value]   ; 360 = %1 0110 1000
  209.            shl value,3
  210.            lea value,[value*4+value]
  211.            add result,value
  212.            cdq
  213.  
  214.            elseif constant eq 416
  215.            shl value,5
  216.            lea result,[value*4+value]   ; 416 = %1 1010 0000
  217.            shl value,3
  218.            add result,value
  219.            cdq
  220.  
  221.            elseif constant eq 448
  222.            lea result,[value*8]         ; 464 = %1 1100 0000
  223.            shl value,2
  224.            lea value,[value*4+value]
  225.            add result,value
  226.            shl result,4
  227.            cdq
  228.  
  229.            elseif constant eq 464
  230.            lea result,[value*8+value]   ; 464 = %1 1101 0000
  231.            shl value,2
  232.            lea value,[value*4+value]
  233.            add result,value
  234.            shl result,4
  235.            cdq
  236.  
  237.            elseif constant eq 480
  238.            shl value,5
  239.            lea result,[value*4+value]   ; 480 = %1 1110 0000
  240.            shl value,1
  241.            lea value,[value*4+value]
  242.            add result,value
  243.            cdq
  244.  
  245.            elseif constant eq 2d00h
  246.            shl value,8                  ; 2d41/4000h = cos(45degrees) = sin(45)
  247.            lea result,[value*4+value]   ; 2d00h = %0010 1101 0000 0000
  248.            shl value,3                  ; 2d41/2d00 = 99.2% correct!
  249.            lea value,[value*4+value]
  250.            add result,value
  251.            cdq
  252.  
  253.            else
  254.            mov result,constant
  255.            imul value
  256.            display "Note: Slow multiplication used in constant multiply"
  257.            display "      See cmul macro in file macros.inc"
  258.            endif
  259.  
  260. endm
  261.  
  262. ; convert 16-bit segment, 16-bit offset to 32-bit flat pointer
  263. ; ( segment, offset in 32-bit registers OR immediate values )
  264.  
  265. @segoff2ptr   macro   ptr32, seg16, off16
  266.               mov     &ptr32, &seg16
  267.               shl     &ptr32, 4
  268.               add     &ptr32, &off16
  269.               sub     &ptr32, _code32a
  270.               endm
  271.  
  272. ; convert 32-bit flat pointer to 16-bit segment, 16-bit offset
  273. ; ( segment, offset in 32-bit registers )
  274.  
  275. @ptr2segoff   macro   ptr32, seg16, off16
  276.               add     &ptr32, _code32a
  277.               mov     &off16, &ptr32
  278.               and     &off16, 0ffffh
  279.               mov     &seg16, &ptr32
  280.               shr     &seg16, 4
  281.               and     &seg16, 0f000h
  282.               endm
  283.  
  284. ; wait for escape key
  285.  
  286. @waitesc      macro
  287.               local   lab1, lab2
  288. lab1:         in      al, 60h
  289.               cmp     al, 1
  290.               jne     lab1
  291. lab2:         in      al, 60h
  292.               cmp     al, 1
  293.               je      lab2
  294.               endm
  295.  
  296.